package com.mdata.service;

import com.mdata.common.BaseRestRequest;
import com.mdata.common.CommonCodeConstant;
import com.mdata.common.DefinitionException;
import com.mdata.common.ResponseEnum;
import com.mdata.model.bo.model.GroupChatGetListModel;
import com.mdata.model.bo.pojo.GroupChatGetListPOJO;
import com.mdata.model.dto.wechat.dto.GroupChatGetDTO;
import com.mdata.model.dto.wechat.dto.GroupChatGetListDTO;
import com.mdata.model.dto.wechat.result.*;
import com.mdata.model.vo.GroupChatListVO;
import com.mdata.utils.PageUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;
import java.util.stream.Collectors;

@Slf4j
@Service
public class GroupChatService extends CommonService {

    @Autowired
    private SimpleService simpleService;
    @Autowired
    private DepartmentService departmentService;

    public PageUtil<GroupChatListVO> getGroupChatManage(GroupChatGetListModel groupChatGetListModel){
        GroupChatGetListPOJO groupChatGetListPOJO = groupChatGetListModel.getGroupChatGetListPOJO();
        List<String> userIdList = new ArrayList<>();
        if(Objects.nonNull(groupChatGetListPOJO.getDepartmentId())){
            List<UserList> simpleList = simpleService.getSimpleList(groupChatGetListPOJO.getDepartmentId(), 1);
            userIdList.addAll(simpleList.stream().map(o -> o.getUserId()).collect(Collectors.toList()));
        }else if(Objects.nonNull(groupChatGetListPOJO.getUserId())){
            userIdList.add(groupChatGetListPOJO.getUserId());
        }
        GroupChatGetListDTO groupChatGetListDTO = new GroupChatGetListDTO(0, null, groupChatGetListModel.getPageSize(), userIdList);
        List<GroupChatList> groupChatList = getGroupChatList(groupChatGetListDTO);

        List<GroupChatListVO> groupChatListVOList = new ArrayList<>();
        Map<Integer, String> departmentNameMap = departmentService.getDepartmentNameMap(null);
        // 默认 应该根目录 departmentId = 1
        Map<String, UserList> simpleMap = simpleService.getSimpleMap(1);
        for (GroupChatList o : groupChatList) {
            GroupChatGetResult groupChat = getGroupChat(new GroupChatGetDTO(o.getChatId(), 1));
            // 模糊查询群名称
            if(StringUtils.isNotEmpty(groupChatGetListPOJO.getGroupChatName())){
                if(StringUtils.isEmpty(groupChat.getGroupChat().getName()) || !groupChat.getGroupChat().getName().contains(groupChatGetListPOJO.getGroupChatName())){
                    continue;
                }
            }
            UserList userList = simpleMap.get(groupChat.getGroupChat().getOwner());
            String groupDepartmentName = Arrays.stream(userList.getDepartment()).mapToObj(department -> departmentNameMap.get(department)).collect(Collectors.joining("，"));
            GroupChatListVO groupChatListVO = new GroupChatListVO(groupChat.getGroupChat().getName(), 10, 20, userList.getName(), groupDepartmentName);
            groupChatListVOList.add(groupChatListVO);
        }
        return new PageUtil(groupChatGetListModel, groupChatListVOList);
    }

    /**
     * 获取客户群列表
     *
     * 该接口用于获取配置过客户群管理的客户群列表。
     *
     * 请求方式：POST（HTTPS）
     * 请求地址：https://qyapi.weixin.qq.com/cgi-bin/externalcontact/groupchat/list?access_token=ACCESS_TOKEN
     * @param groupChatGetListDTO
     * @return
     */
    public List<GroupChatList> getGroupChatList(GroupChatGetListDTO groupChatGetListDTO){
        List<GroupChatList> groupChatList = new ArrayList<>();
        return getGroupChatGetListRecursion(groupChatGetListDTO, groupChatList);
    }

    private List<GroupChatList> getGroupChatGetListRecursion(GroupChatGetListDTO groupChatGetListDTO, List<GroupChatList> groupChatList) {
        GroupChatGetListResult groupChatGetListResult = getGroupChatGetListResult(groupChatGetListDTO);
        groupChatList.addAll(groupChatGetListResult.getGroupChatList());
        // 如果群太多超过 limit 则返回下一次 查询游标cursor，递归查询完所有
        if(StringUtils.isNotEmpty(groupChatGetListResult.getNextCursor())){
            groupChatGetListDTO.setCursor(groupChatGetListResult.getNextCursor());
            getGroupChatGetListRecursion(groupChatGetListDTO, groupChatList);
        }
        return groupChatList;
    }

    public GroupChatGetListResult getGroupChatGetListResult(GroupChatGetListDTO groupChatGetListDTO){
        String url = splicingAccessToken(getWechatCustomerContactSecret(), "externalcontact/groupchat/list");
        GroupChatGetListResult groupChatGetListResult = BaseRestRequest.postForObject(restTemplate, url, groupChatGetListDTO, GroupChatGetListResult.class);
        if(!Objects.equals(groupChatGetListResult.getErrCode(), CommonCodeConstant.SUCCESS_CODE)){
            log.error(groupChatGetListResult.getErrMsg());
            throw new DefinitionException(ResponseEnum.WECHAT_ERROR_GROUP_CHAT_GET_LIST);
        }
        return groupChatGetListResult;
    }

    /**
     * 获取客户群详情
     * 调试工具
     *
     * 通过客户群ID，获取详情。包括群名、群成员列表、群成员入群时间、入群方式。（客户群是由具有客户群使用权限的成员创建的外部群）
     *
     * 需注意的是，如果发生群信息变动，会立即收到群变更事件，但是部分信息是异步处理，可能需要等一段时间调此接口才能得到最新结果
     *
     * 请求方式：POST（HTTPS）
     * 请求地址：https://qyapi.weixin.qq.com/cgi-bin/externalcontact/groupchat/get?access_token=ACCESS_TOKEN
     * @param groupChatGetDTO
     * @return
     */
    public GroupChatGetResult getGroupChat(GroupChatGetDTO groupChatGetDTO){
        String url = splicingAccessToken(getWechatCustomerContactSecret(), "externalcontact/groupchat/get");
        GroupChatGetResult groupChatGetResult = BaseRestRequest.postForObject(restTemplate, url, groupChatGetDTO, GroupChatGetResult.class);
        if(!Objects.equals(groupChatGetResult.getErrCode(), CommonCodeConstant.SUCCESS_CODE)){
            log.error(groupChatGetResult.getErrMsg());
            throw new DefinitionException(ResponseEnum.WECHAT_ERROR_GROUP_CHAT_GET);
        }
        return groupChatGetResult;
    }
}
